load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
load("@bazel_skylib//rules:expand_template.bzl", "expand_template")
load("@rules_cc//cc:defs.bzl", "cc_library")
load("//:gen_test_targets.bzl", "gen_test_targets")

# Targets are based off the root BUCK file in
# https://github.com/facebook/rocksdb/ at this version.

bool_flag(
    name = "with_bzip2",
    build_setting_default = False,
    visibility = ["//visibility:public"],
)

config_setting(
    name = "with_bzip2_setting",
    flag_values = {":with_bzip2": "true"},
    visibility = ["//visibility:public"],
)

bool_flag(
    name = "with_liburing",
    build_setting_default = False,
    visibility = ["//visibility:public"],
)

config_setting(
    name = "with_liburing_setting",
    flag_values = {":with_liburing": "true"},
    visibility = ["//visibility:public"],
)

bool_flag(
    name = "with_lz4",
    build_setting_default = False,
    visibility = ["//visibility:public"],
)

config_setting(
    name = "with_lz4_setting",
    flag_values = {":with_lz4": "true"},
    visibility = ["//visibility:public"],
)

bool_flag(
    name = "with_zlib",
    build_setting_default = False,
    visibility = ["//visibility:public"],
)

config_setting(
    name = "with_zlib_setting",
    flag_values = {":with_zlib": "true"},
    visibility = ["//visibility:public"],
)

bool_flag(
    name = "with_zstd",
    build_setting_default = False,
    visibility = ["//visibility:public"],
)

config_setting(
    name = "with_zstd_setting",
    flag_values = {":with_zstd": "true"},
    visibility = ["//visibility:public"],
)

rocksdb_os_defines = select({
    "@platforms//os:linux": [
        "OS_LINUX",
        "ROCKSDB_AUXV_GETAUXVAL_PRESENT",
        "ROCKSDB_FALLOCATE_PRESENT",
        "ROCKSDB_LIB_IO_POSIX",
        "ROCKSDB_MALLOC_USABLE_SIZE",
        "ROCKSDB_PLATFORM_POSIX",
        "ROCKSDB_PTHREAD_ADAPTIVE_MUTEX",
        "ROCKSDB_RANGESYNC_PRESENT",
        "ROCKSDB_SCHED_GETCPU_PRESENT",
    ],
    "@platforms//os:macos": [
        "OS_MACOSX",
        "ROCKSDB_LIB_IO_POSIX",
        "ROCKSDB_PLATFORM_POSIX",
    ],
    "@platforms//os:windows": [
        "_MBCS",
        "NOMINMAX",
        "OS_WIN",
        "WIN32",
        "WIN64",
    ],
})

feature_defines = select({
    ":with_bzip2_setting": ["BZIP2"],
    "//conditions:default": [],
}) + select({
    ":with_liburing_setting": ["ROCKSDB_IOURING_PRESENT"],
    "//conditions:default": [],
}) + select({
    ":with_lz4_setting": ["LZ4"],
    "//conditions:default": [],
}) + select({
    ":with_zlib_setting": ["ZLIB"],
    "//conditions:default": [],
}) + select({
    ":with_zstd_setting": ["ZSTD"],
    "//conditions:default": [],
})

expand_template(
    name = "build_version_cc",
    out = "util/build_version.cc",
    substitutions = {
        # Just leave these blank, they don't matter as much for Bazel, and
        # people will forget to update them if we put in the actual values.
        "@BUILD_DATE@": "",
        "@GIT_SHA@": "",
        "@GIT_TAG@": "",
        "@GIT_DATE@": "",
        "@GIT_MOD@": "0",
        "@ROCKSDB_PLUGIN_EXTERNS@": "",
        "@ROCKSDB_PLUGIN_BUILTINS@": "",
    },
    template = "util/build_version.cc.in",
)

cc_library(
    name = "rocksdb",
    srcs = [
        "cache/cache.cc",
        "cache/cache_entry_roles.cc",
        "cache/cache_helpers.cc",
        "cache/cache_key.cc",
        "cache/cache_reservation_manager.cc",
        "cache/charged_cache.cc",
        "cache/clock_cache.cc",
        "cache/compressed_secondary_cache.cc",
        "cache/lru_cache.cc",
        "cache/secondary_cache.cc",
        "cache/secondary_cache_adapter.cc",
        "cache/sharded_cache.cc",
        "cache/tiered_secondary_cache.cc",
        "db/arena_wrapped_db_iter.cc",
        "db/attribute_group_iterator_impl.cc",
        "db/blob/blob_contents.cc",
        "db/blob/blob_fetcher.cc",
        "db/blob/blob_file_addition.cc",
        "db/blob/blob_file_builder.cc",
        "db/blob/blob_file_cache.cc",
        "db/blob/blob_file_garbage.cc",
        "db/blob/blob_file_meta.cc",
        "db/blob/blob_file_reader.cc",
        "db/blob/blob_garbage_meter.cc",
        "db/blob/blob_log_format.cc",
        "db/blob/blob_log_sequential_reader.cc",
        "db/blob/blob_log_writer.cc",
        "db/blob/blob_source.cc",
        "db/blob/prefetch_buffer_collection.cc",
        "db/builder.cc",
        "db/c.cc",
        "db/coalescing_iterator.cc",
        "db/column_family.cc",
        "db/compaction/compaction.cc",
        "db/compaction/compaction_iterator.cc",
        "db/compaction/compaction_job.cc",
        "db/compaction/compaction_outputs.cc",
        "db/compaction/compaction_picker.cc",
        "db/compaction/compaction_picker_fifo.cc",
        "db/compaction/compaction_picker_level.cc",
        "db/compaction/compaction_picker_universal.cc",
        "db/compaction/compaction_service_job.cc",
        "db/compaction/compaction_state.cc",
        "db/compaction/sst_partitioner.cc",
        "db/compaction/subcompaction_state.cc",
        "db/convenience.cc",
        "db/db_filesnapshot.cc",
        "db/db_impl/compacted_db_impl.cc",
        "db/db_impl/db_impl.cc",
        "db/db_impl/db_impl_compaction_flush.cc",
        "db/db_impl/db_impl_debug.cc",
        "db/db_impl/db_impl_experimental.cc",
        "db/db_impl/db_impl_files.cc",
        "db/db_impl/db_impl_follower.cc",
        "db/db_impl/db_impl_open.cc",
        "db/db_impl/db_impl_readonly.cc",
        "db/db_impl/db_impl_secondary.cc",
        "db/db_impl/db_impl_write.cc",
        "db/db_info_dumper.cc",
        "db/db_iter.cc",
        "db/dbformat.cc",
        "db/error_handler.cc",
        "db/event_helpers.cc",
        "db/experimental.cc",
        "db/external_sst_file_ingestion_job.cc",
        "db/file_indexer.cc",
        "db/flush_job.cc",
        "db/flush_scheduler.cc",
        "db/forward_iterator.cc",
        "db/import_column_family_job.cc",
        "db/internal_stats.cc",
        "db/log_reader.cc",
        "db/log_writer.cc",
        "db/logs_with_prep_tracker.cc",
        "db/malloc_stats.cc",
        "db/manifest_ops.cc",
        "db/memtable.cc",
        "db/memtable_list.cc",
        "db/merge_helper.cc",
        "db/merge_operator.cc",
        "db/output_validator.cc",
        "db/periodic_task_scheduler.cc",
        "db/range_del_aggregator.cc",
        "db/range_tombstone_fragmenter.cc",
        "db/repair.cc",
        "db/seqno_to_time_mapping.cc",
        "db/snapshot_impl.cc",
        "db/table_cache.cc",
        "db/table_properties_collector.cc",
        "db/transaction_log_impl.cc",
        "db/trim_history_scheduler.cc",
        "db/version_builder.cc",
        "db/version_edit.cc",
        "db/version_edit_handler.cc",
        "db/version_set.cc",
        "db/wal_edit.cc",
        "db/wal_manager.cc",
        "db/wide/wide_column_serialization.cc",
        "db/wide/wide_columns.cc",
        "db/wide/wide_columns_helper.cc",
        "db/write_batch.cc",
        "db/write_batch_base.cc",
        "db/write_controller.cc",
        "db/write_stall_stats.cc",
        "db/write_thread.cc",
        "env/composite_env.cc",
        "env/env.cc",
        "env/env_chroot.cc",
        "env/env_encryption.cc",
        "env/env_posix.cc",
        "env/file_system.cc",
        "env/file_system_tracer.cc",
        "env/fs_on_demand.cc",
        "env/fs_posix.cc",
        "env/fs_remap.cc",
        "env/io_posix.cc",
        "env/mock_env.cc",
        "env/unique_id_gen.cc",
        "file/delete_scheduler.cc",
        "file/file_prefetch_buffer.cc",
        "file/file_util.cc",
        "file/filename.cc",
        "file/line_file_reader.cc",
        "file/random_access_file_reader.cc",
        "file/read_write_util.cc",
        "file/readahead_raf.cc",
        "file/sequence_file_reader.cc",
        "file/sst_file_manager_impl.cc",
        "file/writable_file_writer.cc",
        "logging/auto_roll_logger.cc",
        "logging/event_logger.cc",
        "logging/log_buffer.cc",
        "memory/arena.cc",
        "memory/concurrent_arena.cc",
        "memory/jemalloc_nodump_allocator.cc",
        "memory/memkind_kmem_allocator.cc",
        "memory/memory_allocator.cc",
        "memtable/alloc_tracker.cc",
        "memtable/hash_linklist_rep.cc",
        "memtable/hash_skiplist_rep.cc",
        "memtable/skiplistrep.cc",
        "memtable/vectorrep.cc",
        "memtable/wbwi_memtable.cc",
        "memtable/write_buffer_manager.cc",
        "monitoring/histogram.cc",
        "monitoring/histogram_windowing.cc",
        "monitoring/in_memory_stats_history.cc",
        "monitoring/instrumented_mutex.cc",
        "monitoring/iostats_context.cc",
        "monitoring/perf_context.cc",
        "monitoring/perf_level.cc",
        "monitoring/persistent_stats_history.cc",
        "monitoring/statistics.cc",
        "monitoring/thread_status_impl.cc",
        "monitoring/thread_status_updater.cc",
        "monitoring/thread_status_updater_debug.cc",
        "monitoring/thread_status_util.cc",
        "monitoring/thread_status_util_debug.cc",
        "options/cf_options.cc",
        "options/configurable.cc",
        "options/customizable.cc",
        "options/db_options.cc",
        "options/offpeak_time_info.cc",
        "options/options.cc",
        "options/options_helper.cc",
        "options/options_parser.cc",
        "port/mmap.cc",
        "port/port_posix.cc",
        "port/stack_trace.cc",
        "port/win/env_default.cc",
        "port/win/env_win.cc",
        "port/win/io_win.cc",
        "port/win/port_win.cc",
        "port/win/win_logger.cc",
        "port/win/win_thread.cc",
        "table/adaptive/adaptive_table_factory.cc",
        "table/block_based/binary_search_index_reader.cc",
        "table/block_based/block.cc",
        "table/block_based/block_based_table_builder.cc",
        "table/block_based/block_based_table_factory.cc",
        "table/block_based/block_based_table_iterator.cc",
        "table/block_based/block_based_table_reader.cc",
        "table/block_based/block_builder.cc",
        "table/block_based/block_cache.cc",
        "table/block_based/block_prefetcher.cc",
        "table/block_based/block_prefix_index.cc",
        "table/block_based/data_block_footer.cc",
        "table/block_based/data_block_hash_index.cc",
        "table/block_based/filter_block_reader_common.cc",
        "table/block_based/filter_policy.cc",
        "table/block_based/flush_block_policy.cc",
        "table/block_based/full_filter_block.cc",
        "table/block_based/hash_index_reader.cc",
        "table/block_based/index_builder.cc",
        "table/block_based/index_reader_common.cc",
        "table/block_based/parsed_full_filter_block.cc",
        "table/block_based/partitioned_filter_block.cc",
        "table/block_based/partitioned_index_iterator.cc",
        "table/block_based/partitioned_index_reader.cc",
        "table/block_based/reader_common.cc",
        "table/block_based/uncompression_dict_reader.cc",
        "table/block_fetcher.cc",
        "table/compaction_merging_iterator.cc",
        "table/cuckoo/cuckoo_table_builder.cc",
        "table/cuckoo/cuckoo_table_factory.cc",
        "table/cuckoo/cuckoo_table_reader.cc",
        "table/external_table_reader.cc",
        "table/format.cc",
        "table/get_context.cc",
        "table/iterator.cc",
        "table/merging_iterator.cc",
        "table/meta_blocks.cc",
        "table/persistent_cache_helper.cc",
        "table/plain/plain_table_bloom.cc",
        "table/plain/plain_table_builder.cc",
        "table/plain/plain_table_factory.cc",
        "table/plain/plain_table_index.cc",
        "table/plain/plain_table_key_coding.cc",
        "table/plain/plain_table_reader.cc",
        "table/sst_file_dumper.cc",
        "table/sst_file_reader.cc",
        "table/sst_file_writer.cc",
        "table/table_factory.cc",
        "table/table_properties.cc",
        "table/two_level_iterator.cc",
        "table/unique_id.cc",
        "test_util/sync_point.cc",
        "test_util/sync_point_impl.cc",
        "test_util/transaction_test_util.cc",
        "tools/dump/db_dump_tool.cc",
        "tools/io_tracer_parser_tool.cc",
        "tools/ldb_cmd.cc",
        "tools/ldb_tool.cc",
        "tools/sst_dump_tool.cc",
        "trace_replay/block_cache_tracer.cc",
        "trace_replay/io_tracer.cc",
        "trace_replay/trace_record.cc",
        "trace_replay/trace_record_handler.cc",
        "trace_replay/trace_record_result.cc",
        "trace_replay/trace_replay.cc",
        "util/async_file_reader.cc",
        "util/cleanable.cc",
        "util/coding.cc",
        "util/compaction_job_stats_impl.cc",
        "util/comparator.cc",
        "util/compression.cc",
        "util/compression_context_cache.cc",
        "util/concurrent_task_limiter_impl.cc",
        "util/crc32c.cc",
        "util/crc32c_arm64.cc",
        "util/data_structure.cc",
        "util/dynamic_bloom.cc",
        "util/file_checksum_helper.cc",
        "util/hash.cc",
        "util/murmurhash.cc",
        "util/random.cc",
        "util/rate_limiter.cc",
        "util/ribbon_config.cc",
        "util/slice.cc",
        "util/status.cc",
        "util/stderr_logger.cc",
        "util/string_util.cc",
        "util/thread_local.cc",
        "util/threadpool_imp.cc",
        "util/udt_util.cc",
        "util/write_batch_util.cc",
        "util/xxhash.cc",
        "utilities/agg_merge/agg_merge.cc",
        "utilities/backup/backup_engine.cc",
        "utilities/blob_db/blob_compaction_filter.cc",
        "utilities/blob_db/blob_db.cc",
        "utilities/blob_db/blob_db_impl.cc",
        "utilities/blob_db/blob_db_impl_filesnapshot.cc",
        "utilities/blob_db/blob_dump_tool.cc",
        "utilities/blob_db/blob_file.cc",
        "utilities/cache_dump_load.cc",
        "utilities/cache_dump_load_impl.cc",
        "utilities/cassandra/cassandra_compaction_filter.cc",
        "utilities/cassandra/format.cc",
        "utilities/cassandra/merge_operator.cc",
        "utilities/checkpoint/checkpoint_impl.cc",
        "utilities/compaction_filters.cc",
        "utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc",
        "utilities/convenience/info_log_finder.cc",
        "utilities/counted_fs.cc",
        "utilities/debug.cc",
        "utilities/env_mirror.cc",
        "utilities/env_timed.cc",
        "utilities/fault_injection_env.cc",
        "utilities/fault_injection_fs.cc",
        "utilities/fault_injection_secondary_cache.cc",
        "utilities/leveldb_options/leveldb_options.cc",
        "utilities/memory/memory_util.cc",
        "utilities/merge_operators.cc",
        "utilities/merge_operators/bytesxor.cc",
        "utilities/merge_operators/max.cc",
        "utilities/merge_operators/put.cc",
        "utilities/merge_operators/sortlist.cc",
        "utilities/merge_operators/string_append/stringappend.cc",
        "utilities/merge_operators/string_append/stringappend2.cc",
        "utilities/merge_operators/uint64add.cc",
        "utilities/object_registry.cc",
        "utilities/option_change_migration/option_change_migration.cc",
        "utilities/options/options_util.cc",
        "utilities/persistent_cache/block_cache_tier.cc",
        "utilities/persistent_cache/block_cache_tier_file.cc",
        "utilities/persistent_cache/block_cache_tier_metadata.cc",
        "utilities/persistent_cache/persistent_cache_tier.cc",
        "utilities/persistent_cache/volatile_tier_impl.cc",
        "utilities/simulator_cache/cache_simulator.cc",
        "utilities/simulator_cache/sim_cache.cc",
        "utilities/table_properties_collectors/compact_for_tiering_collector.cc",
        "utilities/table_properties_collectors/compact_on_deletion_collector.cc",
        "utilities/trace/file_trace_reader_writer.cc",
        "utilities/trace/replayer_impl.cc",
        "utilities/transactions/lock/lock_manager.cc",
        "utilities/transactions/lock/point/point_lock_manager.cc",
        "utilities/transactions/lock/point/point_lock_tracker.cc",
        "utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc",
        "utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc",
        "utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc",
        "utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc",
        "utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc",
        "utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc",
        "utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc",
        "utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc",
        "utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc",
        "utilities/transactions/lock/range/range_tree/lib/standalone_port.cc",
        "utilities/transactions/lock/range/range_tree/lib/util/dbt.cc",
        "utilities/transactions/lock/range/range_tree/lib/util/memarena.cc",
        "utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc",
        "utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc",
        "utilities/transactions/optimistic_transaction.cc",
        "utilities/transactions/optimistic_transaction_db_impl.cc",
        "utilities/transactions/pessimistic_transaction.cc",
        "utilities/transactions/pessimistic_transaction_db.cc",
        "utilities/transactions/snapshot_checker.cc",
        "utilities/transactions/transaction_base.cc",
        "utilities/transactions/transaction_db_mutex_impl.cc",
        "utilities/transactions/transaction_util.cc",
        "utilities/transactions/write_prepared_txn.cc",
        "utilities/transactions/write_prepared_txn_db.cc",
        "utilities/transactions/write_unprepared_txn.cc",
        "utilities/transactions/write_unprepared_txn_db.cc",
        "utilities/ttl/db_ttl_impl.cc",
        "utilities/types_util.cc",
        "utilities/wal_filter.cc",
        "utilities/write_batch_with_index/write_batch_with_index.cc",
        "utilities/write_batch_with_index/write_batch_with_index_internal.cc",
        ":build_version_cc",
    ],
    hdrs = glob(["**/*.h"]),
    includes = ["include"],
    local_defines = rocksdb_os_defines + feature_defines,
    visibility = ["//visibility:public"],
    deps = select({
        ":with_bzip2_setting": ["@bzip2//:bz2"],
        "//conditions:default": [],
    }) + select({
        ":with_liburing_setting": ["@liburing"],
        "//conditions:default": [],
    }) + select({
        ":with_lz4_setting": ["@lz4//:lz4_hc"],
        "//conditions:default": [],
    }) + select({
        ":with_zlib_setting": ["@zlib"],
        "//conditions:default": [],
    }) + select({
        ":with_zstd_setting": ["@zstd"],
        "//conditions:default": [],
    }),
)

cc_library(
    name = "rocksdb_test_lib",
    testonly = True,
    srcs = [
        "db/db_test_util.cc",
        "db/db_with_timestamp_test_util.cc",
        "table/mock_table.cc",
        "test_util/mock_time_env.cc",
        "test_util/secondary_cache_test_util.cc",
        "test_util/testharness.cc",
        "test_util/testutil.cc",
        "tools/block_cache_analyzer/block_cache_trace_analyzer.cc",
        "tools/trace_analyzer_tool.cc",
        "utilities/agg_merge/test_agg_merge.cc",
        "utilities/cassandra/test_utils.cc",
    ],
    defines = rocksdb_os_defines,
    includes = ["."],
    deps = [
        ":rocksdb",
        "@googletest//:gtest",
    ],
)

gen_test_targets(
    name = "gen_rocksdb_test_targets",
    srcs = glob(
        ["**/*_test.cc"],
        # Exclude some tests that don't work out of the box.
        exclude = [
            "db/column_family_test.cc",
            "db/db_block_cache_test.cc",
            "db/db_bloom_filter_test.cc",
            "db/db_kv_checksum_test.cc",
            "db/db_test.cc",
            "db/db_universal_compaction_test.cc",
            "db/db_with_timestamp_basic_test.cc",
            "db/error_handler_fs_test.cc",
            "db/external_sst_file_test.cc",
            "java/**",
            "tools/db_sanity_test.cc",
            "utilities/env_mirror_test.cc",
            "utilities/secondary_index/faiss_ivf_index_test.cc",
            "utilities/transactions/transaction_test.cc",
            "utilities/transactions/write_prepared_transaction_test.cc",
        ],
    ),
)
